<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 如果函数内部不声明变量直接赋值变量 ,那么会先在当前函数内部赋值该变量 ,因为该函数内部没有变量声明部分，那么会赋值给外层作用域 然后向上找这个变量的声明  赋值给向上找到的第一个
      // 赋值 ,会先赋值给当前函数, 如果当前函数没有声明 ,那么会向上找a的声明赋值 ，什么时候找到 赋值给这个声明的变量a ,如果全局都没有声明，最终赋值给全局作用域，变成一个全局变量a
      // 注意：一定要在调用函数之后 才能赋值上；
      // 一般前提下 不推荐 不声明定义变量；
      function fun1() {
        // var a;
        fun2();
        console.log(a);
        function fun2() {
          //   var a;  如果这里有a的声明 只有fun2（）内部的a有值
          fun3(); //在调用 fn3的时候由于fn3里的a没有声明 那么声明会赋值给上层作用域
          // console.log(a);
          function fun3() {
            // var a;  //定义一个a
            a = 10; // 给a变量赋值为10；  不推荐
            console.log(a);
          }
        }
      }

      fun1();
      console.log(a);
    </script>
  </body>
</html>
